{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 引入必要的库包\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         date  电力可供量(亿千瓦小时)  电力生产量(亿千瓦小时)  水电生产电力量(亿千瓦小时)  火电生产电力量(亿千瓦小时)  \\\n",
      "0  2004-01-01       21972.3       22033.1          3535.4         17955.9   \n",
      "1  2005-01-01       24940.8       25002.6          3970.2         20473.4   \n",
      "2  2006-01-01       28588.4       28657.3          4357.9         23696.0   \n",
      "3  2007-01-01       32712.4       32815.5          4852.6         27229.3   \n",
      "4  2008-01-01       34540.8       34668.8          5851.9         27900.8   \n",
      "\n",
      "   核电生产电力量(亿千瓦小时)  风电生产电力量(亿千瓦小时)  电力进口量(亿千瓦小时)  电力出口量(亿千瓦小时)  \\\n",
      "0           504.7           446.2          34.0          94.8   \n",
      "1           530.9           446.2          50.1         111.9   \n",
      "2           548.4           446.2          53.9         122.7   \n",
      "3           621.3           446.2          42.5         145.7   \n",
      "4           683.9           446.2          38.4         166.4   \n",
      "\n",
      "   电力能源消费总量(亿千瓦小时)  农、林、牧、渔业电力消费总量(亿千瓦小时)  工业电力消费总量(亿千瓦小时)  建筑业电力消费总量(亿千瓦小时)  \\\n",
      "0          21971.4                  768.9          16424.3             202.1   \n",
      "1          24940.3                  776.3          18521.7             233.9   \n",
      "2          28588.0                  827.0          21267.7             271.0   \n",
      "3          32711.8                  879.0          24290.8             309.0   \n",
      "4          34541.4                  887.1          25388.6             367.3   \n",
      "\n",
      "   交通运输、仓储和邮政业电力消费总量(亿千瓦小时)  批发和零售业、住宿和餐饮业电力消费总量(亿千瓦小时)  其他电力消费总量(亿千瓦小时)  \\\n",
      "0                     449.6                       705.4           1036.6   \n",
      "1                     430.3                       752.3           1340.9   \n",
      "2                     467.4                       847.3           1555.9   \n",
      "3                     531.9                       929.8           1708.6   \n",
      "4                     571.8                      1017.4           1913.0   \n",
      "\n",
      "   居民生活电力消费总量(亿千瓦小时)  电力终端消费量(亿千瓦小时)  工业终端电力消费量(亿千瓦小时)  输配电损失量(亿千瓦小时)  \n",
      "0             2384.5         20550.8           15003.7         1420.6  \n",
      "1             2884.8         23233.8           16815.2         1706.5  \n",
      "2             3351.6         26729.1           19408.9         1858.8  \n",
      "3             4062.7         30650.1           22229.1         2061.7  \n",
      "4             4396.1         32403.5           23250.8         2137.9  \n"
     ]
    }
   ],
   "source": [
    "# 读取数据\n",
    "data = pd.read_csv('../ClearData/Electricity_20_bfill_date.csv', encoding='utf-8')\n",
    "# 打印出数据的前5行，检查数据是否导入正确\n",
    "print(data.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MSE train: 2855029.233, test: 1725195.171\n",
      "R^2 train: 0.993, test: 0.993\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAINCAYAAAAZcvRHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJiUlEQVR4nO3deVxU9f7H8fc4soosagIKKt28amXmUl4sy4rCtH4WeSultDJt0ZtUmtVNbaf9qmVZ3V9a97plUbfFNK9LuZBrlrstGGaAtwRGcwGG7++P+XGuI4KAI8OB1/PxmIfM93zmzGfmUPPmzDnf4zDGGAEAANhAI383AAAAUFUEFwAAYBsEFwAAYBsEFwAAYBsEFwAAYBsEFwAAYBsEFwAAYBsEFwAAYBuN/d1AfVFaWqpffvlFTZs2lcPh8Hc7AADYhjFG+/fvV6tWrdSoUeX7VAguPvLLL78oPj7e320AAGBbu3fvVlxcXKU1BBcfadq0qSTPmx4eHu7nbgAAsA+Xy6X4+Hjrs7QyBBcfKft6KDw8nOACAEANVOVQCw7OBQAAtkFwAQAAtkFwAQAAtsExLrXIGKOSkhK53W5/t4I6zOl0qnHjxpxWDwDHQXCpJUVFRcrJydHBgwf93QpsIDQ0VLGxsQoMDPR3KwBQpxBcakFpaamysrLkdDrVqlUrBQYG8tc0jssYo6KiIv3nP/9RVlaW2rdvf8LJmACgISG41IKioiKVlpYqPj5eoaGh/m4HdVxISIgCAgL0008/qaioSMHBwf5uCQDqDP6Uq0X85Yyq4ncFAI6P/zsCAADbILig1rVr106TJk2qcv2yZcvkcDhUUFBwynqqyIwZMxQZGVnrzwsAOD6CCyrkcDgqvT366KM1Wu/atWs1YsSIKtf36tVLOTk5ioiIqNHz1bbqBjMAQNVxcC4qlJOTY/08d+5cTZgwQTt27LDGwsLCrJ+NMXK73Wrc+MS/Uqeddlq1+ggMDFRMTEy1HgMAqJ/Y42Izbre0bJk0e7bn31M5l11MTIx1i4iIkMPhsO5v375dTZs21Weffabu3bsrKChIK1as0A8//KABAwYoOjpaYWFhOu+88/Tvf//ba73H7pFwOBz6+9//rmuvvVahoaFq3769PvroI2v5sV8VlX19s3DhQnXq1ElhYWHq27evV9AqKSnRPffco8jISDVv3lzjxo3T0KFDdc0111T6mmfMmKE2bdooNDRU1157rX777Tev5Sd6fX369NFPP/2ke++919ozJUm//fabBg0apNatWys0NFSdO3fW7Nmzq7M5AAAiuNhKRobUrp10ySXS4MGef9u184z7y4MPPqhnnnlG27Zt0znnnKMDBw6oX79+Wrx4sb7++mv17dtXV199tbKzsytdz2OPPabrr79e3377rfr166fU1FTt27evwvqDBw/qhRde0D/+8Q99+eWXys7O1pgxY6zlzz77rGbOnKnp06dr5cqVcrlc+vDDDyvtYfXq1Ro2bJhGjRqljRs36pJLLtGTTz7pVXOi15eRkaG4uDg9/vjjysnJscLU4cOH1b17d3366afavHmzRowYoZtvvllr1qyptCcAqEtq84/nChn4RGFhoZFkCgsLyy07dOiQ2bp1qzl06FCN1//++8Y4HMZI3jeHw3N7//2T6f7Epk+fbiIiIqz7S5cuNZLMhx9+eMLHnnXWWebll1+27rdt29b87W9/s+5LMo888oh1/8CBA0aS+eyzz7yeKz8/3+pFkvn++++tx0ydOtVER0db96Ojo83zzz9v3S8pKTFt2rQxAwYMqLDPQYMGmX79+nmN3XDDDV6vuyavryL9+/c3999//3GX+eJ3BgB86f33jYmL8/4MiovzzedPZZ+hx2KPiw243dLo0Z5fk2OVjaWl+Sf59ujRw+v+gQMHNGbMGHXq1EmRkZEKCwvTtm3bTrjH5ZxzzrF+btKkicLDw7V3794K60NDQ/WHP/zBuh8bG2vVFxYWKi8vT+eff7613Ol0qnv37pX2sG3bNvXs2dNrLDEx0Sevz+1264knnlDnzp3VrFkzhYWFaeHChSd8HADUBRkZ0sCB0s8/e4/v2eMZr809/xycawPLl5f/ZTmaMdLu3Z66Pn1qrS1JnpBxtDFjxmjRokV64YUXdMYZZygkJEQDBw5UUVFRpesJCAjwuu9wOFRaWlqtenO8ZOdjNX19zz//vCZPnqxJkyapc+fOatKkidLS0k74OADwtxP98exweP54HjBAcjpPfT/scbGBo4459UndqbRy5Urdcsstuvbaa9W5c2fFxMRo165dtdpDRESEoqOjtXbtWmvM7XZrw4YNlT6uU6dOWr16tdfYV1995XW/Kq8vMDCw3BXAV65cqQEDBuimm25Sly5ddPrpp2vnzp01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53GpT071PC77SvaZvOK8Cm/7SvadTPsnNH36dBMREeE19uabb5qOHTuaoKAg06FDBzN16lRr2ZEjR8zIkSNNTEyMCQoKMm3atDFPP/20McaYtm3bGknWrW3bthU+7+rVq825555rgoKCTPfu3U1GRoaRZL7++mtjjDElJSXmtttuM+3atTPBwcHmj3/8o5k0aZL1+IkTJ3o9lySzdOlSY4wxDzzwgGnfvr0JCQkxCQkJ5pFHHjFFRUU+eb9OFvO4AA3b++8bExdnjOeyhp5bXJxnvD6qzjwuft3jgqrJd+frHdc7J6wbEj5EUc6oWujIs5drwoQJeuWVV9S1a1d9/fXXGj58uJo0aaKhQ4dqypQp+uijj/Tuu++qTZs22r17t3Xm1dq1a9WyZUtNnz5dffv2lbOCPyEOHDigq666Spdffrn++c9/KisrS6NHj/aqKS0tVVxcnObNm6fmzZtr1apVGjFihGJjY3X99ddrzJgx2rZtm1wul6ZPny5JatasmSSpadOmmjFjhlq1aqVNmzZp+PDhatq0qR544IFT+M4BQOUyMqSBA8tfiXnPHs94Q7+wLsHFBopN8YmLqlHnCxMnTtSLL76olP//rychIUFbt27V66+/rqFDhyo7O1vt27fXhRdeKIfDobZt21qPPe200yRJkZGRFZ61JUmzZs1SaWmp/vd//1fBwcE666yz9PPPP+uuu+6yagICArzm00lISFBmZqbeffddXX/99QoLC1NISIiOHDlS7rkeeeQR6+d27dppzJgxmjNnDsEFgN+43dLo0eVDi+QZcziktDRpwICG+7URwQXV9vvvv+uHH37QsGHDNHz4cGu8pKREERERkjwHxF5++eXq0KGD+vbtq6uuukpXXHFFtZ5n27ZtOuecc7yOZzreWV5Tp07VW2+9pezsbB06dEhFRUXW6fKVmTt3rqZMmaIffvhBBw4cUElJicLDw6vVIwD40vLl0s8/V7zcGGn3bk9dnz611lad4tezimBPZVfefvPNN7Vx40brtnnzZn311VeSpG7duikrK0tPPPGEDh06pOuvv14DBw70eS9z5szRmDFjNGzYMH3++efauHGjbr31VhUVFVX6uMzMTKWmpqpfv3765JNP9PXXX+uvf/3rCR8HAKfSUedE+KSuPmKPC6otOjparVq10o8//mhdnuF4wsPDdcMNN+iGG27QwIED1bdvX+3bt0/NmjVTQECA3G53pc/TqVMn/eMf/9Dhw4etvS5lwajMypUr1atXL919993W2A8//OBVExgYWO65Vq1apbZt2+qvf/2rNfbTTz9V/sIB4BQ7aq5Vn9TVR+xxQY089thjSk9P15QpU7Rz505t2rRJ06dP10svvSRJeumllzR79mxt375dO3fu1Lx58xQTE6PIyEhJnmNKFi9erNzcXOtCl8caPHiwHA6Hhg8frq1bt2r+/Pl64YUXvGrat2+vdevWaeHChdq5c6fGjx+vtWvXetW0a9dO3377rXbs2KFff/1VxcXFat++vbKzszVnzhz98MMPmjJlij744APfv1EAUA29e0txcZ5jWY7H4ZDi4z11DRXBBTVy++236+9//7umT5+uzp076+KLL9aMGTOsi1k2bdpUzz33nHr06KHzzjtPu3bt0vz5862Zkl988UUtWrRI8fHx6tq163GfIywsTB9//LE2bdqkrl276q9//aueffZZr5o77rhDKSkpuuGGG9SzZ0/99ttvXntfJGn48OHq0KGDevToodNOO00rV67U//zP/+jee+/VqFGjdO6552rVqlUaP378KXinAKDqnE5p8mTPz8eGl7L7kyY13ANzJclhzPGOXUZ1uVwuRUREqLCwsNwBnocPH1ZWVpYSEhK8DjStqr0lezV7/+wT1g1qOkgtG7c8YR3qvpP9nQFgbxkZnrOLjj5QNz7eE1rq46nQlX2GHotjXGwgwBHg0zoAQO2pyQy4KSmeU56ZObc8gosNRDmjNCR8SKXztAQ4Ampt8jkAQNUcb89JXJzn66AT7TlxOhvuKc+VIbjYBKEEAOyFGXBPDQ7OBQDAx040A67kmQH3BLNC4DgILgAA+Fh1ZsBF9RBcahEncKGq+F0B7I0ZcE8dgkstCAjwnO1z8OBBP3cCuyj7XSn73QFgL8yAe+pwcG4tcDqdioyM1N69eyVJoaGhclQ0LSIaNGOMDh48qL179yoyMlJOzn0EbKlsBtw9e45/nIvD4VnekGfArSmCSy2JiYmRJCu8AJWJjIy0fmcA2E/ZDLgDB3pCytHhhRlwTw7BpZY4HA7FxsaqZcuWKi6ueD4WICAggD0tQD2QkuI55fl487jU1xlwawPBpZY5nU4+lACggWAGXN8juAAAcAoxA65vcVYRAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwDYILAACwjcb+bgAAgLom352vYlNc4fIAR4CinFG12BHKEFwAADhKvjtf77jeOWHdkPAhhBc/4KsiAACOUtmelprUwbcILgAAwDYILgAAwDYILgAAwDYILgAAwDYILgAAwDYILgAAwDYILgAAHCXAEeDTOvgWE9ABAHCUKGeUhoQPYebcOorgAgDAMQgldRdfFQEAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANsguAAAANvgIosAANtwu6Xly6WcHCk2VurdW3I6/d0VahPBBQBgCxkZ0ujR0s8//3csLk6aPFlKSfFfX6hdfFUEAKjzMjKkgQO9Q4sk7dnjGc/I8E9fqH0EFwBAneZ2e/a0GFN+WdlYWpqnDvUfwQUAUKctX15+T8vRjJF27/bUof4juAAA6rScHN/Wwd4ILgCAOi021rd1sDeCCwCgTuvd23P2kMNx/OUOhxQf76lD/UdwAQDUaU6n55RnqXx4Kbs/aRLzuTQUBBcAQJ2XkiK9957UurX3eFycZ5x5XBoOJqADANhCSoo0YAAz5zZ0BBcAgG04nVKfPv7uAv7EV0UAAMA2CC4AAMA2CC4AAMA2OMYFAOBTbjcH0OLUIbgAAHwmI8NzQcSjry0UF+eZh4VTluELfFUEAPCJjAxp4MDyF0Tcs8cznpHhn75QvxBcAAAnze327GkxpvyysrG0NE8dcDIILgCAk7Z8efk9LUczRtq921MHnAyCCwDgpOXk+LYOqAjBBQBw0mJjfVsHVITgAgA4ab17e84eOvbqzWUcDik+3lMHnAyCCwDgpDmdnlOepfLhpez+pEnM54KTR3ABAPhESor03ntS69be43FxnnHmcYEvMAEdAMBnUlKkAQOYORenjt/3uOzZs0c33XSTmjdvrpCQEHXu3Fnr1q2zlhtjNGHCBMXGxiokJERJSUn67rvvvNaxb98+paamKjw8XJGRkRo2bJgOHDjgVfPtt9+qd+/eCg4OVnx8vJ577rlyvcyb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06dPt2oOHTpk7r77bhMVFWVCQ0PNtddea3JycrzWs2vXLnPllVeakJAQ06JFC3P//feb4uJir5qlS5eac8891wQGBprTTz/d6znKvPzyy6ZNmzYmMDDQnH/++earr76q8mshuAAAUDPV+Qx1GGOMv/b21Ccul0sREREqLCxUeHi4v9sBAMA2qvMZWmfOKgIAADgRggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANggsAALANgovdrF4tpaVJbre/OwEAoNY19ncDqIavv5b69pUKCqTWraWxY/3dEQAAtYo9LnaxZYt0+eWe0HLBBdJdd/m7IwAAah3B5RhTp05Vu3btFBwcrJ49e2rNmjX+bknauVO67DLpt9+kHj2kTz+VwsL83RUAALWO4HKUuXPn6r777tPEiRO1YcMGdenSRcnJydq7d6//msrK8oSWvDypSxdp4UIpIsJ//QAA4EcEl6O89NJLGj58uG699VadeeaZmjZtmkJDQ/XWW2/5p6Hdu6VLL5V+/lnq1ElatEhq1sw/vQAAUAcQXP5fUVGR1q9fr6SkJGusUaNGSkpKUmZmZrn6I0eOyOVyed186tAhKSlJ2rVLOuMMafFi6bTTfPscAADYDMHl//36669yu92Kjo72Go+OjlZubm65+vT0dEVERFi3+Ph43zYUEiKNHi0lJHhCS2ysb9cPAIANEVxq6KGHHlJhYaF12717t++f5O67pc2bpTZtfL9uAABsiHlc/l+LFi3kdDqVl5fnNZ6Xl6eYmJhy9UFBQQoKCjr1jYWGnvrnAADAJtjj8v8CAwPVvXt3LV682BorLS3V4sWLlZiY6MfOAABAGfa4HOW+++7T0KFD1aNHD51//vmaNGmSfv/9d916663+bg0AAIjg4uWGG27Qf/7zH02YMEG5ubk699xztWDBgnIH7AIAAP9wGGOMv5uoD1wulyIiIlRYWKjw8HB/twMAgG1U5zOUY1wAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtEFwAAIBtNPZ3A/VF2UW2XS6XnzsBAMBeyj47yz5LK0Nw8ZH9+/dLkuLj4/3cCQAA9rR//35FRERUWuMwVYk3OKHS0lL98ssvatq0qRwOh0/W6XK5FB8fr927dys8PNwn60TNsC3qDrZF3cG2qFvsvD2MMdq/f79atWqlRo0qP4qFPS4+0qhRI8XFxZ2SdYeHh9vul7C+YlvUHWyLuoNtUbfYdXucaE9LGQ7OBQAAtkFwAQAAtkFwqcOCgoI0ceJEBQUF+buVBo9tUXewLeoOtkXd0lC2BwfnAgAA22CPCwAAsA2CCwAAsA2CCwAAsA2CCwAAsA2CSx02depUtWvXTsHBwerZs6fWrFnj75ZsIz09Xeedd56aNm2qli1b6pprrtGOHTu8ag4fPqyRI0eqefPmCgsL03XXXae8vDyvmuzsbPXv31+hoaFq2bKlxo4dq5KSEq+aZcuWqVu3bgoKCtIZZ5yhGTNmlOuHbflfzzzzjBwOh9LS0qwxtkXt2rNnj2666SY1b95cISEh6ty5s9atW2ctN8ZowoQJio2NVUhIiJKSkvTdd995rWPfvn1KTU1VeHi4IiMjNWzYMB04cMCr5ttvv1Xv3r0VHBys+Ph4Pffcc+V6mTdvnjp27Kjg4GB17txZ8+fPPzUvug5yu90aP368EhISFBISoj/84Q964oknvK7Xw7Y4DoM6ac6cOSYwMNC89dZbZsuWLWb48OEmMjLS5OXl+bs1W0hOTjbTp083mzdvNhs3bjT9+vUzbdq0MQcOHLBq7rzzThMfH28WL15s1q1bZ/70pz+ZXr16WctLSkrM2WefbZKSkszXX39t5s+fb1q0aGEeeughq+bHH380oaGh5r777jNbt241L7/8snE6nWbBggVWDdvyv9asWWPatWtnzjnnHDN69GhrnG1Re/bt22fatm1rbrnlFrN69Wrz448/moULF5rvv//eqnnmmWdMRESE+fDDD80333xj/ud//sckJCSYQ4cOWTV9+/Y1Xbp0MV999ZVZvny5OeOMM8ygQYOs5YWFhSY6OtqkpqaazZs3m9mzZ5uQkBDz+uuvWzUrV640TqfTPPfcc2br1q3mkUceMQEBAWbTpk2182b42VNPPWWaN29uPvnkE5OVlWXmzZtnwsLCzOTJk60atkV5BJc66vzzzzcjR4607rvdbtOqVSuTnp7ux67sa+/evUaS+eKLL4wxxhQUFJiAgAAzb948q2bbtm1GksnMzDTGGDN//nzTqFEjk5uba9W89tprJjw83Bw5csQYY8wDDzxgzjrrLK/nuuGGG0xycrJ1n23psX//ftO+fXuzaNEic/HFF1vBhW1Ru8aNG2cuvPDCCpeXlpaamJgY8/zzz1tjBQUFJigoyMyePdsYY8zWrVuNJLN27Vqr5rPPPjMOh8Ps2bPHGGPMq6++aqKioqztU/bcHTp0sO5ff/31pn///l7P37NnT3PHHXec3Iu0if79+5vbbrvNaywlJcWkpqYaY9gWFeGrojqoqKhI69evV1JSkjXWqFEjJSUlKTMz04+d2VdhYaEkqVmzZpKk9evXq7i42Os97tixo9q0aWO9x5mZmercubOio6OtmuTkZLlcLm3ZssWqOXodZTVl62Bb/tfIkSPVv3//cu8X26J2ffTRR+rRo4f+/Oc/q2XLluratavefPNNa3lWVpZyc3O93qeIiAj17NnTa3tERkaqR48eVk1SUpIaNWqk1atXWzUXXXSRAgMDrZrk5GTt2LFD+fn5Vk1l26y+69WrlxYvXqydO3dKkr755hutWLFCV155pSS2RUW4yGId9Ouvv8rtdnv9T1qSoqOjtX37dj91ZV+lpaVKS0vTBRdcoLPPPluSlJubq8DAQEVGRnrVRkdHKzc316o53jYoW1ZZjcvl0qFDh5Sfn8+2lDRnzhxt2LBBa9euLbeMbVG7fvzxR7322mu677779PDDD2vt2rW65557FBgYqKFDh1rv5/Hep6Pf65YtW3otb9y4sZo1a+ZVk5CQUG4dZcuioqIq3GZl66jvHnzwQblcLnXs2FFOp1Nut1tPPfWUUlNTJYltUQGCC+q9kSNHavPmzVqxYoW/W2mQdu/erdGjR2vRokUKDg72dzsNXmlpqXr06KGnn35aktS1a1dt3rxZ06ZN09ChQ/3cXcPy7rvvaubMmZo1a5bOOussbdy4UWlpaWrVqhXbohJ8VVQHtWjRQk6ns9xZFXl5eYqJifFTV/Y0atQoffLJJ1q6dKni4uKs8ZiYGBUVFamgoMCr/uj3OCYm5rjboGxZZTXh4eEKCQlhW8rzVdDevXvVrVs3NW7cWI0bN9YXX3yhKVOmqHHjxoqOjmZb1KLY2FideeaZXmOdOnVSdna2pP++n5W9TzExMdq7d6/X8pKSEu3bt88n26yhbI+xY8fqwQcf1I033qjOnTvr5ptv1r333qv09HRJbIuKEFzqoMDAQHXv3l2LFy+2xkpLS7V48WIlJib6sTP7MMZo1KhR+uCDD7RkyZJyu0m7d++ugIAAr/d4x44dys7Ott7jxMREbdq0yet/CosWLVJ4eLj1P/7ExESvdZTVlK2DbSlddtll2rRpkzZu3GjdevToodTUVOtntkXtueCCC8pNDbBz5061bdtWkpSQkKCYmBiv98nlcmn16tVe26OgoEDr16+3apYsWaLS0lL17NnTqvnyyy9VXFxs1SxatEgdOnRQVFSUVVPZNqvvDh48qEaNvD+GnU6nSktLJbEtKuTvo4NxfHPmzDFBQUFmxowZZuvWrWbEiBEmMjLS66wKVOyuu+4yERERZtmyZSYnJ8e6HTx40Kq58847TZs2bcySJUvMunXrTGJioklMTLSWl52Ce8UVV5iNGzeaBQsWmNNOO+24p+COHTvWbNu2zUydOvW4p+CyLb0dfVaRMWyL2rRmzRrTuHFj89RTT5nvvvvOzJw504SGhpp//vOfVs0zzzxjIiMjzb/+9S/z7bffmgEDBhz3FNyuXbua1atXmxUrVpj27dt7nYJbUFBgoqOjzc0332w2b95s5syZY0JDQ8udgtu4cWPzwgsvmG3btpmJEyfW2VNwT4WhQ4ea1q1bW6dDZ2RkmBYtWpgHHnjAqmFblEdwqcNefvll06ZNGxMYGGjOP/9889VXX/m7JduQdNzb9OnTrZpDhw6Zu+++20RFRZnQ0FBz7bXXmpycHK/17Nq1y1x55ZUmJCTEtGjRwtx///2muLjYq2bp0qXm3HPPNYGBgeb000/3eo4ybEtvxwYXtkXt+vjjj83ZZ59tgoKCTMeOHc0bb7zhtby0tNSMHz/eREdHm6CgIHPZZZeZHTt2eNX89ttvZtCgQSYsLMyEh4ebW2+91ezfv9+r5ptvvjEXXnihCQoKMq1btzbPPPNMuV7effdd88c//tEEBgaas846y3z66ae+f8F1lMvlMqNHjzZt2rQxwcHB5vTTTzd//etfvU5bZluU5zDmqCn6AAAA6jCOcQEAALZBcAEAALZBcAEAALZBcAEAALZBcAEAALZBcAEAALZBcAEAALZBcAGACjgcDn344Yf+bgPAUQguAHzG4XBUenv00Uf93SIAm2vs7wYA1B85OTnWz3PnztWECRO8LugXFhZm/WyMkdvtVuPG/G8IQNWxxwWAz8TExFi3iIgIORwO6/727dvVtGlTffbZZ+revbuCgoK0YsUK3XLLLbrmmmu81pOWlqY+ffpY90tLS5Wenq6EhASFhISoS5cueu+99yrs4+GHH7aujHu0Ll266PHHH5ckrV27VpdffrlatGihiIgIXXzxxdqwYUOF61y2bJkcDocKCgqssY0bN8rhcGjXrl3W2IoVK9S7d2+FhIQoPj5e99xzj37//Xdr+auvvqr27dsrODhY0dHRGjhwYIXPCaA8gguAWvXggw/qmWee0bZt23TOOedU6THp6el65513NG3aNG3ZskX33nuvbrrpJn3xxRfHrU9NTdWaNWv0ww8/WGNbtmzRt99+q8GDB0uS9u/fr6FDh2rFihX66quv1L59e/Xr10/79++v8Wv74Ycf1LdvX1133XX69ttvNXfuXK1YsUKjRo2SJK1bt0733HOPHn/8ce3YsUMLFizQRRddVOPnAxoi9tECqFWPP/64Lr/88irXHzlyRE8//bT+/e9/KzExUZJ0+umna8WKFXr99dd18cUXl3vMWWedpS5dumjWrFkaP368JGnmzJnq2bOnzjjjDEnSpZde6vWYN954Q5GRkfriiy901VVX1ei1paenKzU1VWlpaZKk9u3ba8qUKbr44ov12muvKTs7W02aNNFVV12lpk2bqm3bturatWuNngtoqNjjAqBW9ejRo1r133//vQ4ePKjLL79cYWFh1u2dd97x2qNyrNTUVM2aNUuS53ia2bNnKzU11Vqel5en4cOHq3379oqIiFB4eLgOHDig7Ozsmr0wSd98841mzJjh1WdycrJKS0uVlZWlyy+/XG3bttXpp5+um2++WTNnztTBgwdr/HxAQ8QeFwC1qkmTJl73GzVqJGOM11hxcbH184EDByRJn376qVq3bu1VFxQUVOHzDBo0SOPGjdOGDRt06NAh7d69WzfccIO1fOjQofrtt980efJktW3bVkFBQUpMTFRRUdFx19eokefvvKN7PbrPsl7vuOMO3XPPPeUe36ZNGwUGBmrDhg1atmyZPv/8c02YMEGPPvqo1q5dq8jIyApfC4D/IrgA8KvTTjtNmzdv9hrbuHGjAgICJElnnnmmgoKClJ2dfdyvhSoSFxeniy++WDNnztShQ4d0+eWXq2XLltbylStX6tVXX1W/fv0kSbt379avv/5aaZ+S58ypqKgoq8+jdevWTVu3brW+jjqexo0bKykpSUlJSZo4caIiIyO1ZMkSpaSkVPm1AQ0ZwQWAX1166aV6/vnn9c477ygxMVH//Oc/tXnzZuvYj6ZNm2rMmDG69957VVpaqgsvvFCFhYVauXKlwsPDNXTo0ArXnZqaqokTJ6qoqEh/+9vfvJa1b99e//jHP9SjRw+5XC6NHTtWISEhFa7rjDPOUHx8vB599FE99dRT2rlzp1588UWvmnHjxulPf/qTRo0apdtvv11NmjTR1q1btWjRIr3yyiv65JNP9OOPP+qiiy5SVFSU5s+fr9LSUnXo0OEk3kGgYeEYFwB+lZycrPHjx+uBBx7Qeeedp/3792vIkCFeNU888YTGjx+v9PR0derUSX379tWnn36qhISEStc9cOBA/fbbbzp48GC5U67/93//V/n5+erWrZtuvvlm3XPPPV57ZI4VEBCg2bNna/v27TrnnHP07LPP6sknn/SqOeecc/TFF19o586d6t27t7p27aoJEyaoVatWkqTIyEhlZGTo0ksvVadOnTRt2jTNnj1bZ511VjXeMaBhc5hjv1wGAACoo9jjAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbIPgAgAAbOP/ABya7+6IhnU4AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 600x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用随机森林做拟合\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "\n",
    "# 选择特征和标签\n",
    "X = data[[\"火电生产电力量(亿千瓦小时)\",\"水电生产电力量(亿千瓦小时)\",\"核电生产电力量(亿千瓦小时)\"]]\n",
    "y = data[\"电力生产量(亿千瓦小时)\"]\n",
    "\n",
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)\n",
    "\n",
    "# 训练模型\n",
    "model = RandomForestRegressor(n_estimators=100, random_state=0)\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 预测\n",
    "y_train_pred = model.predict(X_train)\n",
    "y_test_pred = model.predict(X_test)\n",
    "\n",
    "# 评估\n",
    "print('MSE train: %.3f, test: %.3f' % (\n",
    "    mean_squared_error(y_train, y_train_pred),\n",
    "    mean_squared_error(y_test, y_test_pred)))\n",
    "print('R^2 train: %.3f, test: %.3f' % (\n",
    "    r2_score(y_train, y_train_pred),\n",
    "    r2_score(y_test, y_test_pred)))\n",
    "\n",
    "# 画图\n",
    "plt.figure(figsize=(6, 6))\n",
    "plt.scatter(y_train, y_train_pred, c='blue', marker='o', label='Training data')\n",
    "plt.scatter(y_test, y_test_pred, c='lightgreen', marker='s', label='Test data')\n",
    "plt.xlabel('True values')\n",
    "plt.ylabel('Predicted')\n",
    "plt.legend(loc='upper left')\n",
    "plt.plot([0, 1000], [0, 1000], c='red')\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PL",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
